package com.dkd.quartz.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
import javax.sql.DataSource;
import java.util.Properties;

/**
 * 配置 Quartz 定时任务调度器，用于支持集群任务调度。
 * 通过 `SchedulerFactoryBean` 创建 Quartz Scheduler 实例。
 */
//@Configuration
//public class ScheduleConfig {
//
//    /**
//     * 创建并配置 `SchedulerFactoryBean`，用于初始化 Quartz 定时任务调度器。
//     *
//     * @param dataSource 数据源，用于 Quartz 存储 Job 和触发器信息。
//     * @return `SchedulerFactoryBean` 实例
//     */
//    @Bean
//    public SchedulerFactoryBean schedulerFactoryBean(DataSource dataSource) {
//        SchedulerFactoryBean factory = new SchedulerFactoryBean();
//        // 设置 Quartz 使用的数据源，任务信息会存储在该数据源中
//        factory.setDataSource(dataSource);
//
//        // Quartz 参数配置
//        Properties prop = new Properties();
//        // 设置调度器名称
//        prop.put("org.quartz.scheduler.instanceName", "RuoyiScheduler");
//        // 设置调度器实例 ID，AUTO 表示自动生成
//        prop.put("org.quartz.scheduler.instanceId", "AUTO");
//
//        // 配置线程池
//        prop.put("org.quartz.threadPool.class", "org.quartz.simpl.SimpleThreadPool");
//        // 线程池中线程的数量，设为 20
//        prop.put("org.quartz.threadPool.threadCount", "20");
//        // 线程的优先级，默认 5（普通优先级）
//        prop.put("org.quartz.threadPool.threadPriority", "5");
//
//        // 配置 JobStore，使用 Spring 提供的 `LocalDataSourceJobStore` 实现
//        prop.put("org.quartz.jobStore.class", "org.springframework.scheduling.quartz.LocalDataSourceJobStore");
//        // 集群配置，启用集群模式
//        prop.put("org.quartz.jobStore.isClustered", "true");
//        // 集群节点之间的检查时间间隔，单位为毫秒（15 秒）
//        prop.put("org.quartz.jobStore.clusterCheckinInterval", "15000");
//        // 一次最多处理的 misfire（错过的触发事件）数
//        prop.put("org.quartz.jobStore.maxMisfiresToHandleAtATime", "10");
//        // 设置事务隔离级别，防止并发问题
//        prop.put("org.quartz.jobStore.txIsolationLevelSerializable", "true");
//
//        // 针对 SQL Server 数据库的锁定查询（如果使用 SQL Server，可启用此配置）
//        // prop.put("org.quartz.jobStore.selectWithLockSQL", "SELECT * FROM {0}LOCKS UPDLOCK WHERE LOCK_NAME = ?");
//
//        // 设置 misfire 策略阈值为 12 秒
//        prop.put("org.quartz.jobStore.misfireThreshold", "12000");
//        // 数据库表的前缀，默认为 "QRTZ_"
//        prop.put("org.quartz.jobStore.tablePrefix", "QRTZ_");
//
//        // 设置 Quartz 属性
//        factory.setQuartzProperties(prop);
//
//        // 设置调度器名称
//        factory.setSchedulerName("RuoyiScheduler");
//        // 设置延时启动，单位为秒（1 秒后启动）
//        factory.setStartupDelay(1);
//        // 将 Spring 应用上下文注入 Quartz 调度器，以便 Job 中可以获取 Spring Bean
//        factory.setApplicationContextSchedulerContextKey("applicationContextKey");
//
//        // 可选配置：
//        // 启动时自动更新已存在的 Job，这样在修改任务目标类后无需手动删除表记录
//        factory.setOverwriteExistingJobs(true);
//        // 设置自动启动任务调度器，默认为 true
//        factory.setAutoStartup(true);
//
//        return factory;
//    }
//}

